#include <string>
#include <unordered_map>
using namespace std;
class Solution {
public:
    int lengthOfLongestSubstring1(string s) {
        int left = 0,right=0;
        unordered_map<char,int> hashtable;
        int length = 0;
        while(right<s.size())
        {
            hashtable[s[right]]++;
            if(hashtable[s[right]]>1)
            {
                while(s[left] != s[right])
                {
                    hashtable[s[left]]--;
                    left++;
                }
                hashtable[s[left]]--;
                left++;
            }
            // while(hashtable[s[right]]>1)
            // {
            //     hashtable[s[left++]]--;
            // }
            length=max(length,right-left+1);
            right++;
        }
        return length;
    }
    int lengthOfLongestSubstring2(string s)
    {
        int ch[128]={0}; //初始化一个哈希表，数组下标用来表示字符，值表示字符的个数（注意哈希表的大小，小的话会报错）
        int slow=0,fast = 0;
        int maxlength = 0;
        while(fast<s.size())
        {
            //先将元素放入哈希表中

            //1.进入窗口
            ch[s[fast]]++;

            //2.判断
            //判断哈希表中是否有重复元素
            if(ch[s[fast]]>1)//如果该元素出现两次则移动slow指针
            {
                //更新结果
                maxlength = std::max(maxlength,fast-slow);
                while(ch[s[fast]]>1)
                {
                    //3.出窗口
                    ch[s[slow++]]--;
                }
            }
            fast++;
        }
        maxlength = std::max(maxlength,fast-slow);
        return maxlength;
    }
};